package indi.coffeenc.queuedownloader.strategy;

import java.util.ArrayList;
import java.util.UUID;

public class Task {
    /**
     * 源网络地址
     */
    private String source;
    /**
     * 任务的未完成列表
     */
    private final ArrayList<URL> INCOMPLETE = new ArrayList<URL>();
    /**
     * 任务的已完成列表
     */
    private final ArrayList<URL> COMPLETE =new ArrayList<URL>();
    /**
     * 任务的存储地址
     */
    private String dir;
    /**
     * UUID
     */
    private String uuid;
    /**
     * 下载任务的总大小
     */
    private long total;
    /**
     * 下载任务的已完成大小
     */
    private long done;
    /**
     * 设置存储地址
     */
    public void setDir(String dir) {
        this.dir = dir;
    }
    /**
     * 获取存储地址
     */
    public String getDir() {
        return dir;
    }
    /**
     * 获取UUID
     */
    public String getUuid() {
        return uuid;
    }

    /**
     * 添加下载连接
     */
    public void add(URL URL){
        INCOMPLETE.add(URL);
        this.total+= URL.getTotal();
        URL.belong(this);
    }
    /**
     * 进度更新，由Task.URL对象调用
     */
    void flush(int size){
        this.done+=size;
    }

    /**
     * 获取已下载大小
     * 用于计算下载进度
     */
    public long getDone() {
        return done;
    }

    /**
     * 获取任务的总大小
     * 用于计算下载进度
     */
    public long getTotal() {
        return total;
    }

    /**
     * 获取下一条下载链接
     */
    public URL get() {
        for (URL URL : INCOMPLETE)
            return URL;
        return null;
    }

    /**
     * 重置指定链接
     * Uncheck
     */
    public void reset(URL url){
        url.reset();
        /**
         * 重新计算任务的进度
         */
        this.done = 0;
        for(URL url0 :COMPLETE){
            this.done += url0.getTotal();
        }
    }

    /**
     * 重置整个任务
     * Uncheck
     */
    public void reset(){
        /**
         * 重置当前链接
         */
        reset(get());
        /**
         * 重置已完成的链接
         */
        this.done = 0;
        for (URL url : COMPLETE){
            url.reset();
        }
    }

    public boolean isComplete(){ return getTotal() == getDone();}

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    public Task() {
        uuid = UUID.randomUUID().toString();
    }

    /**
     * 包含每个下载地址信息的条目
     */
    public static class URL {
        /**
         * 目标下载地址
         */
        private String url;
        /**
         * 目标文件大小
         */
        private long total;
        /**
         * 已下载完成部分大小
         */
        private long done;
        /**
         * 设置所属Task
         * 该属性不toString
         */
        private Task task;

        public String getUrl() {
            return url;
        }

        public long getTotal() {
            return total;
        }

        public URL setTotal(long total) {
            this.total = total;
            return this;
        }

        public void flush(int size){
            if (task == null)
                return;
            this.done+=size;
            if (this.total == this.done){
                this.task.INCOMPLETE.remove(this);
                this.task.COMPLETE.add(this);
            }
            this.task.flush(size);
        }

        void belong(Task task){this.task = task;}

        /**
         * 重置当前链接的下载进度
         */
        public void reset(){
            this.done = 0;
        }

        public URL(String url) {
            this.url = url;
            this.total = 0;
            this.done = 0;
        }

        @Override
        public String toString() {
            return "{"
                    + "\"url\":\""
                    + url + '\"'
                    + ",\"total\":"
                    + total
                    + ",\"done\":"
                    + done
                    + '}';
        }
    }

    @Override
    public String toString() {
        return "{"
                + "\"uuid\":\""
                + uuid + '\"'
                + ",\"source\":\""
                + source + '\"'
                + ",\"dir\":\""
                + dir + '\"'
                + ",\"incompleteUrls\":"
                + arrayToJson(INCOMPLETE)
                + ",\"completeUrls\":"
                + arrayToJson(COMPLETE)
                + ",\"total\":"
                + total
                + ",\"done\":"
                + done
                + '}';
    }
    public String arrayToJson(ArrayList<URL> array){
        String string = "[";
        boolean b = false;
        for (URL URL : array){
            if (b)
                string += ",";
            string += URL;
            b = true;
        }
        string+="]";
        return string;
    }
}
